/*
 * Nave.h
 *
 *  Created on: 09/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef NAVE_H_
#define NAVE_H_

#include "../../../Framework/IO/SerializableToCharArray.h"

#include "../../Common/CommonTypes.h"
#include "../../Utiles/Posicion.h"

namespace aplicacion {

class Nave : public framework::io::SerializableToCharArray {
//------------------------------ CONSTANTES ------------------------------
public:
	/** velocidad de desplazamiento de la nave */
	static const int _velocidad = 1; //TODO DEFINIR


//--------------------------- ATRIBUTOS ------------------------------------
private:

	Posicion _posicion;

//------------------------------ METODOS ------------------------------
public:
	Nave( const Posicion& posPartida );

	/** este constructor crea una nave cuyo estado deberá ser restaurado
	 * por ejemplo mediante una llamada a load */
	Nave();

	virtual ~Nave();

	std::string toString() const
	{
		std::stringstream stm;
		stm << *this;
		return stm.str();
	}

	bool operator == (const Nave& otro) const;
	bool operator != (const Nave& otro) const;

	/**
	 * Permite obtener el tiempo que falta para que la nave arribe a destino
	 */
	T_TIEMPO getTiempoArribo(const Posicion& destino) const;

	/**
	 * Mueve la nave hacia el destino como si hubiera transcurrido el tiempo
	 * "pasado"
	 *
	 * @return true si llego a destino la nave
	 */
	bool moverADestino(const Posicion& destino, T_TIEMPO pasado);

	//-------------------- de interfaz framework::io::SerializableToFile
	/**
	 * @see framework::io::SerializableToFile#save(int)
	 */
	virtual size_t save (int fd) const;

	/**
	 * @see framework::io::SerializableToFile#load(int)
	 */
	virtual size_t load (int fd);

	/**
	 * @see middleware::io::SerializableToArray#saveToArray(int)
	 */
	virtual size_t saveToArray (uint8_t* arr) const;

	/**
	 * @see middleware::io::SerializableToArray#loadFromArray(int)
	 */
	virtual size_t loadFromArray (const uint8_t* arr);

private:
	friend std::ostream &operator<<( std::ostream &stream, const Nave &obj );
};

} //namespace aplicacion

#endif /* NAVE_H_ */
